package com.zonda.study.opengl.image;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.opengl.GLES20;
import android.opengl.GLUtils;

/**
 * Created by zhuqiuzhu on 17/3/24.
 * 纹理加载帮助类
 */

public class TextureHelper {

    /**
     * 把纹理加载到 OpenGL 中
     *
     * @param context    应用上下文
     * @param resourceId 加载图片资源 ID
     * @return 成功则返回加载图像后的 OpenGL 纹理 的 ID，失败则返回 0
     */
    public static int loadTexture(Context context, int resourceId) {
        final int[] textureObjectIds = new int[1];
        GLES20.glGenTextures(1, textureObjectIds, 0);

        //加载失败
        if (textureObjectIds[0] == 0) {
            return 0;
        }

        final BitmapFactory.Options options = new Options();
        //加载原图
        options.inScaled = false;

        final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
                resourceId, options);

        //读取图片资源失败,则删除纹理对象
        if (bitmap == null) {
            GLES20.glDeleteTextures(1, textureObjectIds, 0);
            return 0;
        }

        //绑定创建的纹理对象，确定为二维纹理对象
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureObjectIds[0]);

        /*--设置默认的纹理过滤参数(即应对纹理对象映射到 OpenGL 上时，针对放大和缩小时的处理)--*/
        //设置纹理缩小时的过滤参数为：三线性过滤
        GLES20.glTexParameteri(textureObjectIds[0], GLES20.GL_TEXTURE_MIN_FILTER,
                GLES20.GL_LINEAR_MIPMAP_LINEAR);
        //设置纹理放大时的过滤参数为：双线性过滤
        GLES20.glTexParameteri(textureObjectIds[0], GLES20.GL_TEXTURE_MAG_FILTER,
                GLES20.GL_LINEAR);

        //OpenGL 读入 bitmap 数据，并把它复制到当前绑定的纹理对象中
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

        //生成 MIP 贴图
        GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

        //位图(即：bitmap)加载完成后释放
        bitmap.recycle();

        //纹理生成后解绑二维纹理对象
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);

        return textureObjectIds[0];
    }
}
